Skip to content

fix: align tools with live TimeTree behavior and add holiday lookup - #37

Merged
ehs208 merged 1 commit into
mainfrom
fix/tool-consistency
Oct 1, 2026
Merged

ehs208 merged 1 commit into
mainfrom
fix/tool-consistency

Conversation

@ehs208

@ehs208 ehs208 commented Oct 1, 2026

Copy link
Copy Markdown
Owner

Description

I ran all 18 tools against a live account and compared the results with what the TimeTree web app shows and sends. This PR fixes the mismatches that comparison found and adds the most useful gaps.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Documentation update

Changes Made

Fixes

  • URL was never saved. TimeTree ignores a top-level url and stores the link in attachment.url. create_event, update_event, and the memo tools now write it there. An empty string removes the URL.
  • checklist: [] returned HTTP 400. TimeTree rejects an empty array, and the web app clears a checklist by omitting it. The client now sends null, which clears it.
  • Partial attachment updates lost data. Sending only url dropped the checklist, but sending only the checklist kept the URL. When an update touches the attachment, the client now fetches the event with the single-event GET /calendar/{id}/event/{uuid} and sends the merged fields. The delete fallback uses the same endpoint instead of a full calendar sync.
  • calendar_id types. get_events and get_updated_events accepted only strings, and the other 14 tools accepted only numbers. list_calendars returns strings, so passing its IDs through failed on most tools. All tools now accept either type.

Additions

  • get_events sorts results by start time, so limit now returns the earliest matching events instead of the first ones in API order. It also adds the start_before, query, label_id, and include_memos filters. The web app's search runs client-side on synced events, so this matches how the web app searches.
  • New get_holidays tool backed by GET /api/v2/memorialdays, which the web app uses to draw holidays. It takes up to 5 countries and a range of up to 2 years, and can exclude observances that fall on working days.

Testing

  • Tested with actual TimeTree account. All writes went to a dedicated test calendar under a [MCP-TEST] prefix, and everything was deleted afterwards.
    • URL: set, kept across checklist edits, and removed with "". The checklist is kept across URL edits and cleared with []. The same holds for memos.
    • String and numeric calendar_id both work, and the get_events filters and sort order behave as described.
    • get_holidays for KR in October 2026 returns Foundation Day, the substitute holiday, and Hangul Day. JP with days_off_only also works.
  • Added/updated tests (18 pass): attachment mapping and merge, no extra GET when the attachment is untouched, memorial days query, get_events filters and sort, string calendar_id, and get_holidays validation.
  • npm run verify passes.

Documentation

  • Updated README.md, README.ko.md, README.ja.md, and COMMANDS.md
  • Updated CHANGELOG.md under [Unreleased]

Additional Notes

  • Clearing virtual_user_attendees with [] could not be verified live because the test calendar has no virtual members.
  • feat: create calendars without inviting members #35 also adds an [Unreleased] section to CHANGELOG, so whichever PR merges second needs a small merge.

🤖 Generated with Claude Code

Verified against a live account and the web app:
- Event and memo URLs are stored in attachment.url; the top-level url
  was silently ignored. Writes now map url into the attachment.
- TimeTree rejects checklist: [] with HTTP 400; null clears it.
- Partial attachment updates drop fields inconsistently, so updates
  now fetch the event (single-event GET) and send merged fields.
- calendar_id accepts strings or numbers in every tool, matching the
  string IDs list_calendars returns.
- get_events sorts by start time and gains start_before, query,
  label_id, and include_memos filters.
- New get_holidays tool backed by the v2 memorial days endpoint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ehs208
ehs208 merged commit c9e77ab into main Oct 1, 2026
3 checks passed
@ehs208
ehs208 deleted the fix/tool-consistency branch October 1, 2026 12:50
ehs208 added a commit to daylight55/TimeTree-MCP that referenced this pull request Oct 2, 2026
Resolve CHANGELOG and api-client test conflicts from ehs208#37-ehs208#39 by keeping
both sides.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant